package com.ccp.dev.workflow.dao;

import com.ccp.dev.core.basic.base.IBaseMapper;
import com.ccp.dev.core.basic.web.query.QueryFilter;
import com.ccp.dev.system.model.GlobalType;
import com.ccp.dev.workflow.model.ProcessRun;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 流程运行模型dao
 */
@Repository
public interface ProcessRunDao extends IBaseMapper<ProcessRun, String> {

    /**
     * 得到流程实例list列表
     *
     * @param filter
     * @return
     */
    List<ProcessRun> getAll(QueryFilter filter);

    /**
     * 返回流程实例明细
     *
     * @param runId
     * @return
     */
    ProcessRun getInstanceTitleById(String runId);

    /**
     * 删除流程实例
     *
     * @param runId
     */
    void delByRunId(String runId);

    /**
     * @return 已办事宜list列表
     */
    List<ProcessRun> queryAlreadyMatterList(QueryFilter queryFilter);

    /**
     * 根据审批人id查询处理过的流程任务数据，包括已经结束的流程
     * @param assignee 审批人
     * @return List<ProcessRun>
     */
    List<ProcessRun> queryMyProcessedMattersList(String assignee);

    /**
     * @return ProcessRun
     */
    ProcessRun getProcessRunById(String runId);


    /**
     * 得到流程历史列表
     *
     * @param queryFilter
     * @return
     */
    List<ProcessRun> queryAllHistory(QueryFilter queryFilter);

    /**
     * 根据业务主键，获取流程实例拓展
     *
     * @param businessKey 业务主键
     * @return 流程实例拓展
     */
    ProcessRun getByBusinessKey(String businessKey);
    List<ProcessRun> getByBusinessKeyList(String businessKey);

    /**
     * 在ACT_HI_PROCINST表中查询该业务主键是否关联流程实例
     *
     * @param businessKey 业务主键
     * @return Integer
     */
    Integer getCountByBusinessKey(String businessKey);

    ProcessRun getByBusinessKeyAndProcDefId(@Param("businessKey")String businessKey, @Param("procDefId")String procDefId);

    List<ProcessRun> getByBusinessKeyFromRunning(@Param("businessKey")String businessKey, @Param("procDefId")String procDefId);

    /**
     * 通过Act的流程实例Id获取ProcessRun实体
     *
     * @param procInstId
     * @return
     */
    ProcessRun getByProcInstanceId(String procInstId);

    ProcessRun getByActInstanceIdHistory(String procInstId);

    /**
     * 通过procInstId 获取流程实例
     * @param procInstId
     * @return
     */
    ProcessRun getByProcInstanceIdFromHis(String procInstId);


    /**
     * @return 办结事宜list列表
     */
    List<ProcessRun> queryCompletedMattersList(QueryFilter queryFilter);

    /**
     * @return 我的请求list列表
     */
    List<ProcessRun> queryMyRequestList(QueryFilter queryFilter);

    /**
     * 我的请求和我的办结流程分类列表
     * @param userId 当前用户id
     * @return 分类列表
     */
    List<GlobalType> queryMyRequestAndMyCompletedTypeList(@Param("userId") String userId,@Param("category") String category);


    /**
     * 我的草稿list列表
     *
     * @param queryFilter
     * @return
     */
    List<ProcessRun> queryMyDraft(QueryFilter queryFilter);

    /**
     * @return 我的办结list列表
     */
    List<ProcessRun> queryMyCompletedList(QueryFilter queryFilter);

    void delActHiProcessInstanceByRunId(String runId);

    void delByIdHistory(String id);

    void delByIds(String[] lAryId);

    ProcessRun getCopyIdByRunid(String runId);

    /**
     * 增加流程运行历史
     *
     * @param processRun
     * @return
     */
    int addHistory(ProcessRun processRun);

    /**
     * 更新流程运行历史
     *
     * @param processRun
     * @return
     */
    int updateHistory(ProcessRun processRun);

    void delActHiProcessInstanceByProcInstId(String procInstId);

    /**
     * 根据act流程实例Id删除扩展的流程历史实例记录。
     *
     * @param procInstId
     */
    void delHistoryByprocInstId(String procInstId);

    /**
     * 根据act流程实例Id删除扩展的流程实例记录。
     *
     * @param procInstId
     */

    void delProByProcInstId(String procInstId);

    /**
     * 根据流程实例Id删除非主线程的流程历史记录。
     *
     * @param procInstId
     */
    void delSubHistoryByProcInstId(String procInstId);

    /**
     * 根据流程实例Id删除非主线程的流程。
     *
     * @param procInstId
     */
    void delSubProByProcInstId(String procInstId);

    void delSubActHiProcessInstanceByProcInstId(String procInstId);

    /**
     * 到历史表查询流程实例
     *
     * @param runId
     * @return
     */
    ProcessRun getByIdHistory(String runId);

    /**
     * 修改BPM_PRO_RUN表数据
     *
     * @param processRun
     */
    int updateProcessRun(ProcessRun processRun);

    /**
     * 根据runId查询历史记录
     * @param relRunId
     * @return
     */
    ProcessRun getByHistoryId(String relRunId);

    /**
     * 查询流程实例
     * @param procDefId
     * @return
     */
    List<ProcessRun> queryByProcDefId(String procDefId);
    /**
     * 查询测试状态流程实例
     * @param procDefId
     * @return
     */
    List<ProcessRun> queryTestRunByProcDefId(String procDefId);
    /**
     * 已办事宜和办结事宜流程分类列表
     * @param assignee
     * @return 分类列表
     */
    List<GlobalType> queryAlreadyMatterAndCompletedMattersTypeList(@Param("assignee") String assignee, @Param("category") String category);

    /**
     * 获取我提交过的某个流程的流程实例。
     * @param modelId           流程定义
     * @param creatorId         当前人
     * @param instanceAmount    实例数
     * @return
     */
    List<ProcessRun> getRefList(@Param("modelId") String modelId, @Param("creatorId") String creatorId, @Param("instanceAmount") Integer instanceAmount);
    /**
     * 获取抄送给我的某个流程的流程实例。
     * @param modelId	        流程定义
     * @param curUserId 		当前人
     * @param instanceAmount	实例数
     * @return
     */
    List<ProcessRun> getRefListCopyTo(@Param("modelId") String modelId, @Param("curUserId") String curUserId, @Param("instanceAmount") Integer instanceAmount);

    void delActHiProcessInstanceByProcDefId(String procDefId);

    void delHistoryByProcDefId(String procDefId);
}